<?php
        session_start();
       
        class wave
        {
                public $nombre;
                public function __construct($nombre = 0)
                {
                        if(!empty($nombre))
                        {
                                $this->nombre = $nombre;
                                $strlen = strlen($this->nombre);
                               
                                $binary = ''; // Contiendra les donnees, juste les donnees.
                               
                                for($i = 0; $i < $strlen; $i++)
                                {
                                        $binary .= $this->get_datas($this->nombre{$i}.'.wav');                
                                }
                       
                                $this->package($binary);
                        }
                }
               
                public function analyse($wav,$arg = FALSE)
                {
                               
                                $entete_unpack = 'a4file_type/Lfile_size/a4file_id/A4nom_zone1/Ltaille_zone1/SFormatTag/SChannels/LSamplesPerSec/LAvgBytesPerSec/SBlockAlign/SBitsPerSample/A4nom_data/Ltaille_data';
                               
                                $fp = fopen($wav,'r');
                                $file = fread($fp, 44 );
                               
                                $entete = unpack($entete_unpack,$file);
                                fclose($fp);
                               
                               
                                if( ($entete['file_type'] !== chr(0x52).chr(0x49).chr(0x46).chr(0x46) ) OR ( $entete['file_id'] !== chr(0x57).chr(0x41).chr(0x56).chr(0x45) ) )
                                {
                                        trigger_error('Le fichier '.$wav.' n\'est pas un fichier wav',E_USER_ERROR);
                                }
                               
                                if(!$arg)
                                        return $entete;
                                else
                                        return $entete[$arg];
                }
               
       
                private function get_datas($wav)
                {
                           
                                $fp = fopen($wav,'r');
                                fseek($fp, 44 );
                               
                                $datas = fread($fp, $this->analyse($wav, 'taille_data'));
                                               
                                fclose($fp);
                               
                                return $datas;
                }
               
                private function package($datas)
                {
                        $entete_pack = 'a4La4A4LSSLLSSA4L';
                       
                                $entete = $this->analyse($this->nombre{0}.'.wav');
                               
                                for($i = 1;$i<strlen($this->nombre); $i ++)
                                {
                                        $entete2 = $this->analyse($this->nombre{$i}.'.wav');      
                                        if($entete !== $entete2)
                                        {
                                                if($entete['Channels'] !== $entete2['Channels'])
                                                {
                                                        trigger_error('fonction package, un ou plusieurs fichiers wad n\'ont pas le meme nombre de canaux',E_USER_ERROR);
                                                }
                                               
                                                if($entete['BitsPerSample'] !== $entete2['BitsPerSample'])
                                                {
                                                        trigger_error('fonction package, un ou plusieurs fichiers wad, n\'ont pas le meme nombre d\'echantillons par seconde', E_USER_ERROR);
                                                }
                                               
                                                if($entete['SamplesPerSec'] !== $entete2['SamplesPerSec'])
                                                {
                                                        trigger_error('fonction package, un ou plusieurs fichiers wad, n\'ont pas la meme frequence d\'echantillonage', E_USER_WARNING);
                                                }
                                        }
                                }
                       
                        /* On calcule la taille des donnees que l'on a creees selon la formule de soundeditor */
                        $entete['taille_data'] = strlen($datas);
                        $entete['taille_data'] /= $entete['BlockAlign'];
                        $entete['taille_data'] *= $entete['BlockAlign'];
                       
                        $entete['file_size'] = 44 + strlen($datas);
                       
                        /* on "pack l en-tete et on y ajoute les donnees */
                        $binary = pack($entete_pack, $entete['file_type'],$entete['file_size'],$entete['file_id'],$entete['nom_zone1'],
                        $entete['taille_zone1'],$entete['FormatTag'],$entete['Channels'],$entete['SamplesPerSec'],$entete['AvgBytesPerSec'],
                        $entete['BlockAlign'],$entete['BitsPerSample'],$entete['nom_data'],$entete['taille_data']);
                        $binary .= $datas;
                       
                        /* On transmet ou enregistre */
                              header('Content-type: audio/x-wav');
                              header('Content-Disposition: attachment; filename="le-code.wav"');
                              echo $binary;
                }
        }
        $wav = new wave($_SESSION['captchaResult']);
?>